﻿#ifndef COMTHREAD_H
#define COMTHREAD_H
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QSerialPort>
#include <QTimer>

//ComThread类继承自QThread，用于处理串口通信
class ComThread : public QThread
{
    Q_OBJECT
public:
    // 构造函数，接受一个父对象
    ComThread(QObject *parent=0);
    // 析构函数
    ~ComThread();
     // 事务处理，连接串口，设置波特率，数据位，停止位，奇偶校验，命令列表，是否循环发送，通讯标志
    void transaction(const QString &portName,const uint &baudRate,const int& dataBits,
                     const int &stopBits,const QString &parity,QList<QByteArray>& commandList,bool isCycle,quint8 comFlag);
    // 关闭串口
    void closeSerialPort();
    // 线程运行函数，继承自QThread
    void run() override;

    // 停止读取信息
    void stopReadInfo();

    // 停止读取信息
    void sendChanged(QList<QByteArray>& commandList,bool isCycle,quint8 comFlag,quint8 batteryCnt);//comFlag为通讯标志

    // 修改发送延迟时间
    void changeDelay(quint16 waitRx_MS,quint16 waitRx_byte_MS,quint16 rxFailWait_MS,quint16 rxWait_MS);

   //--------------------通讯失败处理
    void setComFailAction(quint32& comFailCnt,bool continueCom);

    //------------------唤醒处理
    void wakeUp();


signals:
    // 发射数据，用于在通讯过程中接收到的数据
    void responseData(QByteArray dataArray);
    // 发射消息，用于显示对话框提示或comStatus提示
    void responseMsg(const QString &s,bool isDialog);//isDialog:true 对话框提示  false:comstatus提示
    // 发射错误信息
    void error(const QString &s);
    // 发射时间信息
    void responseTime(QString time);
protected:
private slots:
    // 线程的私有槽函数，用于定时发送唤醒帧
    void tenSecShot();
private:
    QByteArray calCheck(QByteArray& waitCheck);
    bool m_quit;// 是否退出线程
    QMutex m_mutex;// 线程同步锁
    QWaitCondition m_cond;// 线程等待条件
    //----------------------------
    QString m_portName;// 串口名称
    uint m_baudRate;// 波特率
    int m_dataBits;// 数据位
    int m_stopBits;// 停止位
    QSerialPort::Parity m_parity;// 奇偶校验
    uint m_waitTimeOut;// 超时时间

    QList<QByteArray> m_commandList;//发送的数据帧
    bool m_isCycle;// 是否循环发送
    bool m_pause;// 是否暂停
    bool m_newData; //有新的发送数据来


    quint8 m_comFlag;// 通讯标志
    quint8 m_batteryCnt;// 电池数量

    // 发送延迟时间
    quint16 m_waitRx_MS;
    quint16 m_waitRx_byte_MS;
    quint16 m_rxFailWait_MS;
    quint16 m_rxWait_MS;

    //通讯失败处理
    quint32 m_comFailCnt;
    bool m_continueCom;

    bool m_comSleep;  //通讯暂停了，要求每隔十秒发一次唤醒帧，发十次，间隔50ms

    // 定时器
    QTimer timer ;
};

#endif // COMTHREAD_H
